class Subscriber {
  // 构造函数，初始化一个空数组
  constructor() {
    this.subscribers = []
  }
  // 添加事件监听器
  add(eventname, cb) {
    // 查找事件对象
    let eventObj = this.subscribers.find((item) => item.eventname === eventname)
    // 如果事件对象存在，则将回调函数添加到事件对象的回调函数数组中
    if (eventObj) {
      eventObj.cbs.push(cb)
      // 如果事件对象不存在，则创建一个新的事件对象，并将回调函数添加到事件对象的回调函数数组中
    } else {
      this.subscribers.push({ eventname, cbs: [cb] })
    }
  }
  // 添加事件监听器
  on(eventname, cb) {
    // 调用add方法添加事件监听器
    this.add(eventname, cb)
  }
  // 移除事件监听器
  off(eventname, cb) {
    // 查找事件对象
    let eventObj = this.subscribers.find((item) => item.eventname === eventname)
    // 如果事件对象存在，则将回调函数从事件对象的回调函数数组中移除
    if (eventObj) {
      eventObj.cbs = eventObj.cbs.filter((item) => item !== cb)
    }
  }
  // 触发事件
  emit(eventname, ...args) {
    // 遍历事件对象数组
    this.subscribers.forEach((item) => {
      // 如果事件对象的事件名与触发的事件名相同，则调用事件对象的回调函数数组中的回调函数
      if (item.eventname === eventname) {
        item.cbs.forEach((cb) => {
          cb(...args)
        })
      }
    })
  }
}
// 返回订阅总线
export const subscriberIns = new Subscriber()
